(*
 * Copyright (c) 2015, Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the "hack" directory of this source tree.
 *
 *)

(* Not all stats are worth logging for every user. Things like the initial heap
 * size are pretty deterministic if you know the input (i.e. the files being
 * checked). In fact, it's *only* useful information if you know the input.
 * This file is for storing these types of stats: Things that would be useful
 * for a benchmark script to know, so it can say "for these inputs, under these
 * conditions, here's how hh_server behaves".
 *)
type t = {
  mutable init_parsing_heap_size: int;
  mutable init_heap_size: int;
  mutable max_heap_size: int;
  gc_stat: Gc.stat;
}

let stats : t =
  {
    init_parsing_heap_size = 0;
    init_heap_size = 0;
    max_heap_size = 0;
    gc_stat = Gc.quick_stat ();
  }

let get_stats () = { stats with gc_stat = Gc.quick_stat () }

let update_max_heap_size x = stats.max_heap_size <- max stats.max_heap_size x

let to_json stats =
  Hh_json.JSON_Object
    [
      ("init_parsing_heap_size", Hh_json.int_ stats.init_parsing_heap_size);
      ("init_shared_heap_size", Hh_json.int_ stats.init_heap_size);
      ("max_shared_heap_size", Hh_json.int_ stats.max_heap_size);
      ("master_heap_words", Hh_json.int_ stats.gc_stat.Gc.heap_words);
      ("master_top_heap_words", Hh_json.int_ stats.gc_stat.Gc.top_heap_words);
    ]
